package com.symaster.common.swing;

import java.awt.*;

/**
 * @author yinmiao
 * @version 2022-11-28 19:34
 */
public abstract class BaseElement extends BaseListener implements Cloneable, TextLoader.TextChangeListener, java.io.Serializable {

    private static final long serialVersionUID = -4323123948562394L;
    private TextLoader textLoader;
    private boolean listenerInit = false;

    public void setTextLoader(TextLoader textLoader) {
        this.textLoader = textLoader;
        textLoader.addTextChangeListener(this);
    }

    public void allChange() {
        initText();
    }

    public static <T extends BaseElement> T get(Class<T> clazz, Object... params) {
        try {
            T t = clazz.newInstance();
            t.get(params);
            return t;
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 返回此组件
     */
    public Component get(Object... o) {
        initPage();
        initText();
        if (!listenerInit) {
            initListener();
            listenerInit = true;
        }
        initData(o);
        return this;
    }

    /**
     * 在此处初始化页面, 每次显示页面之前会调用此方法
     */
    public abstract void initPage();

    /**
     * 在此处初始化数据
     */
    public abstract void initData(Object... o);

    /**
     * 在此处初始化事件, 首次显示页面之前会调用此方法
     */
    public abstract void initListener();

    /**
     * 此处设置所有组件文件
     */
    public abstract void initText();

    /**
     * 获取文本
     */
    public String getText(String key) {
        return textLoader.getText(key);
    }

    @Override
    public BaseElement clone() {
        try {
            return (BaseElement) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}
